package br.unicamp.ft.sahp.controller.facade;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import br.unicamp.ft.sahp.controller.servico.AvaliacaoService;
import br.unicamp.ft.sahp.controller.servico.AvaliadorService;
import br.unicamp.ft.sahp.controller.servico.LoginService;
import br.unicamp.ft.sahp.controller.servico.NivelFormacaoService;
import br.unicamp.ft.sahp.controller.servico.QuestaoService;
import br.unicamp.ft.sahp.controller.servico.QuestionarioService;
import br.unicamp.ft.sahp.controller.servico.RelatorioAvaliacaoService;
import br.unicamp.ft.sahp.controller.servico.SistemaService;
import br.unicamp.ft.sahp.controller.servico.TextoService;
import br.unicamp.ft.sahp.model.entidades.Avaliacao;
import br.unicamp.ft.sahp.model.entidades.Avaliador;
import br.unicamp.ft.sahp.model.entidades.NivelFormacao;
import br.unicamp.ft.sahp.model.entidades.Pessoa;
import br.unicamp.ft.sahp.model.entidades.Questao;
import br.unicamp.ft.sahp.model.entidades.Questionario;
import br.unicamp.ft.sahp.model.entidades.Sistema;
import br.unicamp.ft.sahp.model.entidades.Texto;
import br.unicamp.ft.sahp.model.exception.AvaliacaoNaoEncontradaException;
import br.unicamp.ft.sahp.model.exception.AvaliadorExistenteException;
import br.unicamp.ft.sahp.model.exception.AvaliadorNaoEncontradoException;
import br.unicamp.ft.sahp.model.exception.QuestaoNaoEncontradaException;
import br.unicamp.ft.sahp.model.exception.QuestionarioNaoEncontradoException;
import br.unicamp.ft.sahp.model.exception.SistemaNaoEncontradoException;
import br.unicamp.ft.sahp.model.exception.TextoNaoEncontradoException;
import br.unicamp.ft.sahp.model.exception.UsuarioNaoEncontradoException;

/**
 * Classe que implementa a Fachada do Sistema SAHP.
 * 
 * @author Luis Lucana (luislucana@gmail.com)
 * 
 */
@Component
public class SAHPFacadeImpl implements SAHPFacade {

	@Autowired
	private LoginService loginService;
	@Autowired
	private AvaliacaoService avaliacaoService;
	@Autowired
	private AvaliadorService avaliadorService;
	@Autowired
	private TextoService textoService;
	@Autowired
	private NivelFormacaoService nivelFormacaoService;
	@Autowired
	private SistemaService sistemaService;
	@Autowired
	private QuestaoService questaoService;
	@Autowired
	private QuestionarioService questionarioService;
	@Autowired
	private RelatorioAvaliacaoService relatorioAvaliacaoService;

	public Pessoa login(String usuario, String senha)
			throws UsuarioNaoEncontradoException {

		return loginService.login(usuario, senha);
	}

	public List<Avaliador> buscarAvaliadoresPorNomeLoginNivel(
			String nomeAvaliador, String loginAvaliador,
			Integer codigoNivelFormacao) throws AvaliadorNaoEncontradoException {

		return avaliadorService.consultarAvaliadoresPorNomeLoginNivel(
				nomeAvaliador, loginAvaliador, codigoNivelFormacao);
	}

	public void cadastrarAvaliador(Avaliador avaliador) throws AvaliadorExistenteException {
		avaliadorService.cadastrarAvaliador(avaliador);
	}

	public void cadastrarTexto(Texto texto, Long codigoSistema)
			throws AvaliacaoNaoEncontradaException {
		textoService.cadastrarTexto(texto, codigoSistema);
	}

	public List<Texto> buscarTextoPorParametros(String objetivo, String explicativo, String agradecimento) {
		return textoService.consultarTextoPorParametros(objetivo, explicativo, agradecimento);
	}

	public List<NivelFormacao> buscarTodosNiveisFormacao() {
		return nivelFormacaoService.buscarTodosNiveisFormacao();
	}

	public NivelFormacao buscarNivelFormacaoPeloCodigo(
			Integer codigoNivelFormacao) {
		return nivelFormacaoService
				.buscarNivelFormacaoPeloCodigo(codigoNivelFormacao);
	}

	public Avaliador buscarAvaliadorPeloCodigo(Long codigoAvaliador) {
		return avaliadorService.buscarAvaliadorPeloCodigo(codigoAvaliador);
	}

	public void alterarAvaliador(Avaliador avaliador) {
		avaliadorService.atualizarAvaliador(avaliador);
	}

	public void excluirAvaliador(Avaliador avaliador) {
		avaliadorService.excluirAvaliador(avaliador);
	}

	public void excluirAvaliador(Long codigoAvaliador) {
		avaliadorService.excluirAvaliador(codigoAvaliador);
	}

	public void cadastrarLink(Sistema sistema) {
		sistemaService.cadastrarLink(sistema);
	}

	public void alterarLink(Long codigoLink, String nomeSistema,
			String linkSistema) {
		sistemaService.atualizarLink(codigoLink, nomeSistema, linkSistema);
	}

	public List<Sistema> buscarLinksPeloNome(String nomeSistema)
			throws SistemaNaoEncontradoException {

		return sistemaService.buscarLinksPeloNome(nomeSistema);
	}

	public Sistema buscarLinksPeloCodigo(Long codigoSistema) {
		return sistemaService.buscarLinksPeloCodigo(codigoSistema);
	}

	public List<Questao> buscarQuestoesPeloTexto(String textoQuestao)
			throws QuestaoNaoEncontradaException {

		return questaoService.buscarQuestoesPeloTexto(textoQuestao);
	}

	public void cadastrarQuestao(String textoQuestao) {
		questaoService.cadastrarQuestao(textoQuestao);
	}

	public Questao buscarQuestoesPeloCodigo(Long codigoQuestao) {
		return questaoService.buscarQuestoesPeloCodigo(codigoQuestao);
	}

	public void alterarQuestao(Long codigoQuestao, String textoQuestao) {
		questaoService.atualizarQuestao(codigoQuestao, textoQuestao);
	}

	public void cadastrarQuestionario(String descricaoQuestionario,
			List<String> questoes) {

		questionarioService.cadastrarQuestionario(descricaoQuestionario,
				questoes);
	}

	public Questionario buscarQuestionarioPeloCodigo(Long codigoQuestionario) {
		return questionarioService
				.buscarQuestionarioPeloCodigo(codigoQuestionario);
	}

	public List<Questionario> buscarQuestionariosPeloNome(
			String nomeQuestionario) throws QuestionarioNaoEncontradoException {

		return questionarioService
				.buscarQuestionariosPeloNome(nomeQuestionario);
	}

	public List<Sistema> buscarSistemasSemAvaliacao()
			throws SistemaNaoEncontradoException {

		return sistemaService.buscarSistemasSemAvaliacao();
	}

	public List<Questao> buscarTodasQuestoes()
			throws QuestaoNaoEncontradaException {
		return questaoService.buscarTodasQuestoes();
	}

	public void alterarTexto(Texto texto) {
		textoService.atualizarTexto(texto);
	}

	public Texto buscarTextoPeloCodigo(Long codigoTexto) {
		return textoService.buscarTextoPeloCodigo(codigoTexto);
	}

	public void excluirTexto(Long codigoTexto) {
		textoService.excluirTexto(codigoTexto);
	}

	public void excluirTexto(Texto texto) {
		textoService.excluirTexto(texto);
	}

	public void excluirLink(Long codigoLink) {
		sistemaService.excluirLink(codigoLink);
	}

	public void excluirQuestao(Long codigoQuestao) {
		questaoService.excluirQuestao(codigoQuestao);
	}

	public Questionario montarStringListaSistemasAssociadosAoQuestionario(
			Questionario questionario) {

		return questionarioService
				.montarStringListaSistemasAssociadosAoQuestionario(questionario);
	}

	public void alterarQuestionario(Long codigoQuestionario, String nome,
			List<String> questoesSelecionadas) {

		questionarioService.alterarQuestionario(codigoQuestionario, nome,
				questoesSelecionadas);
	}

	public void excluirQuestionario(Long codigoQuestionario) {
		questionarioService.excluirQuestionario(codigoQuestionario);
	}

	public List<Avaliador> buscarTodosAvaliadores()
			throws AvaliadorNaoEncontradoException {
		return avaliadorService.buscarTodosAvaliadores();
	}

	public List<Questionario> buscarTodosQuestionarios()
			throws QuestionarioNaoEncontradoException {
		return questionarioService.buscarTodosQuestionarios();
	}

	public void cadastrarAvaliacao(String nomeAvaliacao, Long codigoSistema,
			Long codigoQuestionario, Long codigoAvaliador) {
		avaliacaoService.cadastrarAvaliacao(nomeAvaliacao, codigoSistema,
				codigoQuestionario, codigoAvaliador);
	}

	public List<Avaliacao> buscarAvaliacoesPorNomeSistemaQuestionarioAvaliador(
			String nomeAvaliacao, Long codigoSistema, Long codigoQuestionario,
			Long codigoAvaliador) throws AvaliacaoNaoEncontradaException {
		
		return avaliacaoService
				.buscarAvaliacoesPorNomeSistemaQuestionarioAvaliador(
						nomeAvaliacao, codigoSistema, codigoQuestionario,
						codigoAvaliador);
	}
	
	public List<Sistema> buscarTodosSistemas() throws SistemaNaoEncontradoException {
		return sistemaService.buscarTodosSistemas();
	}
	
	public Avaliacao buscarAvaliacaoPeloCodigo(Long codigoAvaliador) {
		return avaliacaoService.buscarAvaliacaoPeloCodigo(codigoAvaliador);
	}
	
	public void alterarAvaliacao(Long codigoAvaliacao, String nome, Long codigoSistema,
			Long codigoQuestionario, Long codigoAvaliador) {
		
		avaliacaoService.alterarAvaliacao(codigoAvaliacao, nome, codigoSistema,
				codigoQuestionario, codigoAvaliador);
	}
	
	public void excluirAvaliacao(Long codigoAvaliacao) {
		avaliacaoService.excluirAvaliacao(codigoAvaliacao);
	}
	
	public List<Avaliacao> buscarAvaliacoesPorAvaliador(Long codigoAvaliador)
			throws AvaliacaoNaoEncontradaException {
		
		return avaliacaoService.buscarAvaliacoesPorAvaliador(codigoAvaliador);
	}
	
	public void cadastrarRelatorioAvaliacao(Long codigoAvaliacao, List<String> respostas) {
		relatorioAvaliacaoService.cadastrarRelatorioAvaliacao(codigoAvaliacao, respostas);
	}
	
	public List<Sistema> buscarSistemasNaoAvaliadosSemTexto()
			throws SistemaNaoEncontradoException {
		
		return sistemaService.buscarSistemasNaoAvaliadosSemTexto();
	}
	
	public List<Avaliacao> buscarAvaliacoesRespondidas()
			throws AvaliacaoNaoEncontradaException {
		return avaliacaoService.buscarAvaliacoesRespondidas();
	}
	
	public Texto buscarTextoPelaAvaliacao(Long codigoAvaliacao)
			throws TextoNaoEncontradoException {
		return textoService.buscarTextoPelaAvaliacao(codigoAvaliacao);
	}
	
	public Avaliacao buscarAvaliacaoComRespostas(Long codigoAvaliacao) {
		return avaliacaoService.buscarAvaliacaoComRespostas(codigoAvaliacao);
	}
	
	public List<Questao> buscarQuestoesAvaliacao(Long codigoAvaliacao) {
		return avaliacaoService.buscarQuestoesAvaliacao(codigoAvaliacao);
	}
	
	public List<Texto> buscarTodosTextos(){
		return textoService.consultarTodosTextos();
	}
}